/*
 * Copyright 2002-2015 the original author or authors.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 * in compliance with the License. You may obtain a copy of the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software distributed under the License
 * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 * or implied. See the License for the specific language governing permissions and limitations under
 * the License.
 */
package org.huihoo.ofbiz.smart.session;

/**
 * A repository interface for managing {@link Session} instances.
 *
 * @author Rob Winch
 * @since 1.0
 */
public interface SessionRepository<S extends Session> {

  /**
   * Creates a new {@link Session} that is capable of being persisted by this
   * {@link SessionRepository}.
   *
   * <p>
   * This allows optimizations and customizations in how the {@link Session} is persisted. For
   * example, the implementation returned might keep track of the changes ensuring that only the
   * delta needs to be persisted on a save.
   * </p>
   *
   * @return a new {@link Session} that is capable of being persisted by this
   *         {@link SessionRepository}
   */
  S createSession();

  /**
   * Ensures the {@link Session} created by
   * {@link org.springframework.session.SessionRepository#createSession()} is saved.
   *
   * <p>
   * Some implementations may choose to save as the {@link Session} is updated by returning a
   * {@link Session} that immediately persists any changes. In this case, this method may not
   * actually do anything.
   * </p>
   *
   * @param session the {@link Session} to save
   */
  void save(S session);

  /**
   * Gets the {@link Session} by the {@link Session#getId()} or null if no {@link Session} is found.
   *
   * <p>
   * If the {@link Session} extends {@link ExpiringSession}, then
   * {@link ExpiringSession#getLastAccessedTime()} will be updated on the returned object. In order
   * to persist this change, {@link #save(Session)} must be invoked on the returned instance.
   * </p>
   *
   * @param id the {@link org.springframework.session.Session#getId()} to lookup
   * @return the {@link Session} by the {@link Session#getId()} or null if no {@link Session} is
   *         found.
   */
  S getSession(String id);

  /**
   * Deletes the {@link Session} with the given {@link Session#getId()} or does nothing if the
   * {@link Session} is not found.
   * 
   * @param id the {@link org.springframework.session.Session#getId()} to delete
   */
  void delete(String id);
}
